C#.NStar (Alpha RC) 0.9



Привет, неизвестный путник! Здесь вы можете просмотреть информацию о C#.NStar (Alpha RC) 0.9. Вы можете скачать EXE или просмотреть список изменений, скриншоты и/или видео.
Что уже проверено и работает в дополнение к версии Pre-Pre-I-4:
1. Работа с файлами.
2. При техническом крахе сохраняется лог во временную папку.
3. Потоки. Причем нет этого ужасного разбиения на две воюющих стороны - синхронные и асинхронные - переключение контекста происходит автоматически.
4. "Швейцарский нож" (оператор is, сопоставление шаблонов). Пока что реализованы семь шаблонов: константа, тип, тип с объявлением переменной, var с объявлением переменной, шаблон сравнения (больше/меньше), пустой шаблон (_) и составной шаблон - несколько шаблонов, объединенных операторами and, or, not. Есть одна замеченная, но не исправленная ошибка, что попытка применить шаблон сравнения не к числу вызывает технический крах. Возможно, в будущем исправлю.
5. Сокращенный оператор for - можно написать так:
for (i in collection)
{
    ...
}

- или так:
for (i in a..b)
{
    ...
}

6. Сокращенные константы - если есть ключевое слово const, необзательно писать var или тем более полный тип.
7. Записи (Record - с прописной буквы). В отличие от C#.NET, это по терминологии Мартина чистые структуры данных, имеющие свойства, совпадащие по именам и типам с параметрами, конструктор из эих параметров и стандартные методы Equals и GetHashCode и неспособные иметь другие методы и свойства.
8. Структуры (Struct - с прописной буквы).
9. Прототип полиморфизма в виде словарей от рекурсивного типа к классу, одним из следующих способов (ключевое слово Class в случае полиморфизма обязтельно брать в скобки):
const [typename T, (Class)] ClassName = new(
{
    ...
});

const ClassName = new [typename T, (Class)](
{
    ...
});

const var ClassName = new [typename T, (Class)](
{
    ...
});

const [typename T, (Class)] ClassName = new [typename T, (Class)](
{
    ...
});

const [typename T : BaseType, (Class : BaseType2)] ClassName = new(
{
    ...
});

const ClassName = new [typename T : BaseType, (Class : BaseType2)](
{
    ...
});

const var ClassName = new [typename T : BaseType, (Class : BaseType2)](
{
    ...
});

const [typename T : BaseType, (Class : BaseType2)] ClassName = new [typename T : BaseType, (Class : BaseType2)](
{
    ...
});

Словари от чисел, строк или других типов, кроме typename, пока лучше даже не пытаться создавать - они не работают!
10. Обработка исключений:
try
{
    ...
}
catch (ExceptionType var) if (condition) // if, а не when
{
    ...
}

В текущей версии доступен базовый набор исключений: Exception, ArgumentException (включает в себя ArgumentNullException и ArgumentOutOfRangeException, хотя явно указать их нельзя), IndexOutOfRangeException, InvalidOperationException, NullReferenceException и IOException.
11. И самое невероятное - ПАКЕТНЫЙ МЕНЕДЖЕР!!! Вы можете подключить любой пакет, доступный в публичном репозитории NuGet - достаточно зайти в настройки и указать его имя.
Рабочие примеры кода на C#.NStar, в дополнение к предыдущим версиям:
using System;
using System.Threading;
Class MyClass
{
    Constructor()
    {
    }
    int Function Sync()
    {
        var x = MyClass2.MyFunc(5);
        return x;
    }
    Task[int] Function Async1()
    {
        var x = MyClass2.MyFunc(5);
        return x;
    }
    Task[int] Function Async2(int n)
    {
        return n * n;
    }
}

static Class MyClass2
{
    Func[Task[int], int] MyFunc = new MyClass().Async2;
}

return new MyClass().Async1();


object item = "Welcome!";
if (item is string text)
return text;


abstract Class BaseStack
{
    required typename T { get, init };

    abstract T Function Peek();
    abstract T Function Pop();
    abstract null Function Push(T item);
}

const [typename T, (Class : BaseStack[T])] Stack = new(
{
    private () T list = new(32);

    T Function Peek()
    {
        return list[^1];
    }

    T Function Pop
    {
        return list.GetAndRemove(list.Length - 1);
    }

    null Function Push(T item)
    {
    list.Add(item);
    }
});

BaseStack[int] intStack = new Stack[int]();
intStack.Push(5);
intStack.Push(10);
var x = (intStack.Pop(), intStack.Peek());
BaseStack[string] stringStack = new Stack[string]();
stringStack.Push("A");
stringStack.Push("B");
var y = (stringStack.Pop(), stringStack.Peek());
return (x, y);


() int list = new();
for (i in Chain(0, 10)) while (i * i % 20 < 10)
{
    list.Add(i);
}
return list;


int n = 0;
for (i in 1..1000)
{
    n++;
}
return n;


Record Pair(string Name, int Value);
Pair pair = new("Status", 100);
return pair;


const [typename T : IComparable[T], (Class)] Repository = new(
{
    private () T items = new();

    null Function Add(T item)
    {
        items.Add(item);
    }

    T Function GetMax()
    {
        if (items.Length == 0)
            return null;
        return Max(items);
    }
});

    Class Product : IComparable[Product]
    {
    int Id;
    int Function CompareTo(Product product)
    {
        return Id.CompareTo(product.Id);
    }
}

var repo = new Repository[Product]();
repo.Add(new Product[1]());
repo.Add(new Product[5]());
return repo.GetMax().Id;


using System;
using System.IO;
try
{
    () int list = (1, 2, 3);
    return list.IndexOf(1, 5);
}
catch (ex) if (ex is not ArgumentException)
{
    return 1;
}
catch (ex)
{
    return "" + ex.Message;
}
return 2;



Все остальное не проверено и, скорее всего, не работает .

Ссылка на EXE (~150 MB)



Скачать из облаков

Назад ко всем версиям